<?php
/**
 * Система писем на базе темплейтов.
 */
class Workset_Mail {

	/**
	 * Список переменных,спользуемые в темплейте.
	 * 
	 * @var array
	 */
	protected $templateVariables = array();

	/**
	 * Путь к каталогу с темплейтами писем.
	 * 
	 * @var string
	 */
	protected $templatePath;

	/**
	 * Название темплейта.
	 * 
	 * @var string
	 */
	protected $templateName;

	/**
	 * @var Zend_Mail
	 */
	protected $zendMail;

	/**
	 * @var string;
	 */
	protected $recipient;

	/**
	 * Инициализация объекта класса.
	 * 
	 * @param string $charset
     * @param array $params
	 */
	public function __construct($charset = 'iso-8859-1', array $params = array()) {
		$this->zendMail = new Zend_Mail($charset);

        foreach ($params as $name => $value) {
            $this->$name = $value;
        }
	}

	/**
	 * Задание значения переменной, используемой в темплейте.
	 *
	 * @param string $name
	 * @param mixed  $value
	 */
	public function __set($name, $value) {
		$this->templateVariables[$name] = $value;
	}

	/**
	 * Задание пути к темплейтам писем.
	 * 
	 * @param string $path
	 */
	public function setTemplatePath($path) {
		$this->templatePath = $path;
	}

	/**
	 * Задание имени файла темплейта.
	 *
	 * @param string $filename
	 */
	public function setTemplate($filename) {
		$this->templateName = $filename;
	}

	/**
	 * Задание адреса получателя.
	 *
	 * @param string $email
	 */
	public function setRecipient($email) {
		$this->recipient = $email;
	}

	/**
	 * Отправка письма.
	 */
	public function send($params) {
		$params = (array)$params;
		$this->templateVariables = array_merge($this->templateVariables,$params);

		// Получение параметров из конфига.
		$config = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getOption('email');

		$fromAddr = isset($config['from'])
			? $config['from']
			: '';

		$templateVars = isset($config['vars'])
			? $config['vars']
			: array();

		foreach ($templateVars as $key => $value) {
			// If a variable is present in config which hasn't been set
			// add it to the list
			if (!array_key_exists($key, $this->templateVariables)) {
				$this->{$key} = $value;
			}
		}

		// Build template
		// Check that template file exists before using
		$viewConfig = array('scriptPath' => $this->templatePath);
		$subjectView = new Zend_View($viewConfig);

		foreach ($this->templateVariables as $key => $value) {
			$subjectView->{$key} = $value;
		}

		try {
			$subject = $subjectView->render($this->templateName . '.subj');
		}
		catch (Zend_View_Exception $e) {
			$subject = false;
		}

		$textView = new Zend_View($viewConfig);

		foreach ($this->templateVariables as $key => $value) {
			$textView->{$key} = $value;
		}

		try {
			$text = $textView->render($this->templateName . '.txt');
		}
		catch (Zend_View_Exception $e) {
			$text = false;
		}

		$htmlView = new Zend_View($viewConfig);

		foreach ($this->templateVariables as $key => $value) {
			$htmlView->{$key} = $value;
		}

		try {
			$html = $htmlView->render($this->templateName . '.php');
		}
		catch (Zend_View_Exception $e) {
			$html = false;
		}

		// Pass variables to Zend_Mail
		$this->zendMail->setFrom($fromAddr);
		$this->zendMail->addTo($this->recipient);
		$this->zendMail->setSubject($subject);
		$this->zendMail->setBodyText($text);

		if ($html !== false) {
			$this->zendMail->setBodyHtml($html);
		}

		$this->zendMail->send();
	}
}
?>